const router = require('koa-router')()
const util = require('../utils/index.js')
const Dept = require('../models/deptSchema.js')

router.prefix('/api/dept')

// 获取所有部门列表
router.get('/allList', async (ctx) => {
    try {
        const list = await Dept.find({}, '_id deptName')
        ctx.body = util.success(list, '')
    } catch (error) {
        ctx.body = util.fail(error.stack)
    }
})

// 列表
router.get('/list', async (ctx) => {
    const { deptName } = ctx.request.query
    const params = {}
    if (deptName) params.deptName = deptName
    let rootList = await Dept.find(params)
    if (deptName) {
        ctx.body = util.success(rootList, '')
    } else {
        // [] 这里是一个引用类型，会随着变化而变化
        const treeList = getTreeDept(rootList, null, [])
        ctx.body = util.success(treeList, '')
    }
})

// 递归拼接树形列表
function getTreeDept(rootList, id, list) {
    // 遍历一级菜单
    for (let i = 0; i < rootList.length; i++) {
        let item = rootList[i]
        // 判断如果是一级菜单，parentId 为 null，把下级菜单添加到 list中
        // slice: 防止改变原有对象，快速克隆
        // string: buff转字符串
        if (String(item.parentId.slice().pop()) == String(id)) {
            list.push(item._doc)
        }
    }
    // 遍历二级菜单
    list.map(item => {
        item.children = []
        // 递归遍历，如果 item._id 等于 parentId 则添加到 item.children 中
        getTreeDept(rootList, item._id, item.children)
        if (item.children.length == 0) {
            delete item.children
        }
    })
    return list
}

// 新增
router.post('/add', async (ctx, next) => {
    try {
        const { _id, ...params } = ctx.request.body
        let res = await Dept.create(params)
        ctx.body = util.success({}, '创建成功')
    } catch (error) {
        ctx.body = util.fail(error.stack)
    }
})

// 编辑
router.post('/update', async (ctx, next) => {
    try {
        const { _id, ...params } = ctx.request.body
        params.updateTime = new Date()
        let res = await Dept.findByIdAndUpdate(_id, params)
        ctx.body = util.success({}, '更新成功')
    } catch (error) {
        ctx.body = util.fail(error.stack)
    }
})

// 删除
router.post('/delete', async (ctx, next) => {
    try {
        const { _id } = ctx.request.body
        let res = await Dept.findByIdAndRemove(_id)
        // 删除包含_id的所有文档
        await Dept.deleteMany({ parentId: { $all: [_id] } })
        ctx.body = util.success({}, '删除成功')
    } catch (error) {
        ctx.body = util.fail(error.stack)
    }
})

module.exports = router
